Technical Note TN2049
'pdat' specification

目次


このテクニカルノートは、Mac OS 8 および Mac OS 9 において CarbonLib 印刷をサポートするためにプリンタベンダがドライバに含める必要のある 'pdat' リソースについて説明します。

[2002 年 4 月 10 日]






はじめに

Mac OS X には、Mac OS 8 および Mac OS 9 で利用できる Classic Printing Manager とは大きく異なる新しい印刷システムが導入されました。Carbon Printing Manager は、この 2 つのアーキテクチャの橋渡しをし、Carbon アプリケーションがどちらのプラットフォームでも印刷できるようにします。

Mac OS 8 および Mac OS 9 では、Carbon Printing Manager は CarbonLib に組み込まれています。Mac OS 8 および Mac OS 9 で実行される Carbon アプリケーションは、これまでと同様 Classic プリンタドライバを使って印刷します。ほとんどの Carbon Printing Manager 関数は、対応する Classic 関数を呼び出します。Mac OS X においては、印刷フレームワークは Carbon アンブレラフレームワークに属しています。Carbon アプリケーションは、Mac OS X 上で実行される時は自動的に新しい印刷システムを使います。

Carbon Printing Manager は、Classic から Carbon への移行ができるだけ簡単になるように設計されています。関数名は変わっていますが、Classic と Carbon の印刷関数は、かなりの部分が一致しており、また基本の印刷ループモデルは維持されています。

アプリケーションの印刷ループ構造が根本的に変わるわけではないので、アプリケーションで Carbon Printing Manager を採用するのは比較的簡単です。一番大きな違いは、Cassic のプリントレコードに対応するデータ構造体が Carbon では不透過であることです。つまり、中身はアプリケーションからは見えません。これらの構造体のフィールドにアクセスするための新しい関数があります。その他の関数のほとんどは、Classic Printing Manager の関数をそのまま置き換えたものです。

新しい関数をサポートするために、Carbon Printing Manager は、Classic プリンタドライバが、これらの設定を Classic プリントレコードのどこに格納しているかを知る必要があります。そこで 'pdat' リソースが役に立ちます。

Carbon Printing Manager 関数は次の 3 つのカテゴリに分けられます。

  1. Classic Printing Manager 関数に直接対応する関数。 たとえば PMSessionPageSetupDialogPrStlDialog を呼び出します。
  2. Mac OS X 専用に予約されている関数。たとえば PJCSetPSInjectionData などがあります。このカテゴリに属している関数のいくつかは(PMSessionUseSheetsなど) CarbonLib にあり、kPMNotImplemented を返します。一方、CarbonLib にない関数(PMSessionCreatePageFormatList など)もあり、リンクエラーを起こします。
  3. Classic Printing Manager に対応する関数がまったくなく、Carbon Printing Manager に直接 Classic のドライバのプリントレコードにアクセスさせる関数。たとえば、PMSetOrientationPMSetScale などがあります。

'pdat' リソースの目的は、3 番目のカテゴリに属する関数をサポートすることです。次にその関数の例をいくつか示します。

PMSessionValidatePageFormat
PMSessionValidatePrintSettings
PMSessionConvertOldPrintRecord
PMSessionMakeOldPrintRecord
PMGetScale
PMSetScale
PMGetResolution
PMSetResolution
PMGetOrientation
PMSetOrientation
PMGetCopies
PMSetCopies
PMGetColorMode
PMSetColorMode

重要:

セッション関数には、同じカテゴリに属する非セッション関数が対応しています。しかしこの非セッション関数は、セッション API を優先したため使用廃止になりました。

1 番目のカテゴリに属している関数の場合、Carbon Printing Manager は、Carbon Printing Manager の仕様に従った Classic ドライバに依存します。このことは、 ドライバが、『Inside Macintosh Imaging with QuickDraw』 の 9 章で定義されている TPrint フィールドを使用する必要があることを意味します。

さらに、用紙設定と印刷設定が同じデータ構造体に格納される Classic Printing Manager とは異なり、Carbon Printing Manager は、用紙設定に 1 つ、印刷設定に 1 つの合わせて 2 つのオブジェクトを保持します。Classic プリントレコードを更新する必要がある場合、Carbon Printing Manager は、PrJobMerge() を呼び出して、用紙設定オブジェクトと印刷設定オブジェクトから設定をコピーします。このため、Classic プリントドライバには、PrJobMerge を正しく実装する必要があります。PrJobMerge が正しく機能していない時は、PrJobMerge を呼び出しても、用紙設定と印刷設定は保持されません。

次に例を示します。

PrStlDialog(prec1);  // 用紙設定にある設定を有効にする
PrJobDialog(prec2);  // プリントダイアログの設定を有効にする
PrJobMerge(prec2,prec1);

PrStlDialog(prec1);  // 最初の用紙設定は
                     // 保存されているか?

PrJobDialog(prec1);  // これは、最初のジョブダイアログにある
                     // すべての設定を保持しているか?
 

PrJobMerge の実行内容の概要は、QuickDraw Printing Manager Reference に示されています。また、 Technote 1161: Extending the Print Record for LaserWriter 8 でも書かれているように、PrJobMerge の実装は、拡張プリントレコードにあるフィールドを正しく処理する必要があります。

PrJobMerge が呼び出された時、対象のプリントレコードには用紙設定が含まれています。このプリントレコードの正当性が確認された場合には、ジョブ固有のプリントダイアログ設定をコピーします。対象のプリントレコードの正当性が認められなかった場合は、ソースレコードからすべての設定をコピーします。

先頭に戻る



'pdat' リソースとは何か

'pdat' リソースは、Carbon Printing Manager 関数が使用する Classic プリントレコード(TPrint)の設定の場所とエンコーディングを定義するデータ構造です。

CarbonLib システム拡張には、レガシーな Classic プリンタドライバをサポートするために 'pdat' リソースのデータベースが含まれています。このデータベースの構造を次の節で説明します。


重要:
開発者には、CarbonLib 1.4.5 の後にリリースされたすべてのプリンタドライバに、自身で 'pdat' リソースを追加することが要求されます。アップルでは今後、リリースの CarbonLib 拡張に 'pdat' リソースの追加は行いません。


先頭に戻る



'pdat' リソースの形式

'pdat' リソースには、印刷の方向、倍率、カラーモードなどのプリントレコード設定のデータ形式と記憶場所に関する情報が含まれます。

'pdat' リソースの形式は次のとおりです。

  1. 各設定は 4 バイトのタグ名で識別されます(以下のリストを参照)。
  2. 設定の格納場所は、連続するビット領域になくても構いません。
  3. 印刷の方向など、列挙型の設定の場合、'pdat' リソースは ON の設定値を指定します。これについては以下、「Type1 データ形式」の節で説明します。
  4. 描画の解像度などスカラー値として保存される設定の場合、'pdat' リソースはデータ形式を指定します。以下の「Type2 データ形式」を参照してください。

先頭に戻る



タグ

ドライバのプリントレコード内にある、Carbon Printing Manager がアクセスする必要のある設定を識別するタグは 11 個あります。

#define pdatPortrait 'port' // 必須
#define pdatLandscape 'land'
#define pdatReversePortrait 'rpor'
#define pdatReverseLandscape 'rlan'
#define pdatBlackAndWhite 'blkw' // 必須
#define pdatGrayscale 'gray'
#define pdatColormode 'colr'
#define pdatScale 'scal' // 必須
#define pdatHRes 'hres' // 必須
#define pdatVRes 'vres' // 必須
#define pdatCopies 'copy' // 必須

これらの 11 個のタグすべてにデータを提供することをお勧めします。この内 6 個は必須です。

先頭に戻る



Type1 データ形式

Carbon Printing Manager は、2 つのタイプのプリントレコード設定を認識します。Type1 の設定は、縦、横、場合によっては縦反転、横反転を含む印刷方向などの列挙型に使用されます。Type2 の設定は、倍率や解像度のようなパラメータに使用されます。

Type1 の各設定は、1 つ以上のエントリの並びから構成され、次のように定義されます。

struct PdatRecord1Data {
 UInt16 format;  // 0 - ビット、1 - 1 バイト、2 - 2 バイト
 UInt16 offset;  // プリントレコード内部へのオフセット
 UInt16 mask;  // オフセット領域に適用されるマスク
 UInt16 value;  // このモードを起動する値
};
typedef struct PdatRecord1Data PdatRecord1Data;

struct PdatRecord1 {  // モードの on、off の切り換えに使用
 UInt32 tag;  // タグ
 UInt16 count;  // 1〜n:次のエントリのうち
    // このタグのモードを on にするエントリの数
 PdatRecord1Data entry[1]; // 最低 1 つは必要
};
typedef struct PdatRecord1 PdatRecord1;

この構造体は、Type1 の設定に対する完全な制御機能を提供します。たとえば、ドライバが印刷方向の設定を保存するために、プリントレコードで 2 ビット(連続ビットではない)使っているとします。この場合、'pdat' レコードのカウント数は 2 となり、1 つのエントリは、縦/横を表すビットの場所とそれらのビットの値の意味(1=縦、2=横など)を指定し、もう 1 つのエントリは、反転設定(0=正常、1=反転)を指定します。

先頭に戻る



Type2 データ形式

Type2 のエントリは、解像度や倍率などスカラー値の設定に使用されます。Type2 のデータは次のようになります。

struct PdatRecord2 {  // 値の設定に使用
 UInt32  tag;  // タグ
 UInt16  format; // 0 ビット、1 バイト、2 バイト、4 バイト(データ格納方法)
 UInt16  offset; // プリントレコード内部へのオフセット
 UInt32  mask;  // オフセット領域に適用するマスク
 UInt16  adjustment; // 10 進数での pt 調整
};
typedef struct  PdatRecord2 PdatRecord2;

この構造体により様々なデータ形式を処理できる。プリントレコードからの設定値を取得する式は次のとおり。
    ((offset 位置にある値) & ‾mask)/adjustment
また設定値を変更する式は次のとおり。
    ((設定する値)*adjustment) & mask

先頭に戻る



'pdat' リソースのありか

Carbon Printing Manager は次の手順に従い、'pdat' レコードを探して、プリンタドライバのためにそれをロードします。

  1. System ファイルから 'STR ' -8192 を取得し現在のプリンタドライバを参照します。
  2. プリンタドライバファイルを探し、そのファイルがある場合は、 'pdat' リソースをロードします。今後リリースされるバージョンのドライバにはそれぞれに応じた 'pdat' リソースを含める必要があります。Carbon Printing Manager は、リソース ID ではなくリソースのタイプに基づいて 'pdat' リソースをロードするので、'pdat' リソースのリソース ID は無関係です。ただし、ドライバには 'pdat' リソースが 1 つしかないようにします。
  3. ドライバに 'pdat' リソースが含まれていない場合は、'vers' 1 のリソースから NumVersion フィールドとドライバのクリエータタイプを取得します。この情報は、Carbon Printing Manager のデータベースの検索キーを作成するために使われます。このことは、各プリンタドライバは一意のクリエータコードを持つ必要があることを意味します。ある時点では、既存ドライバの 'pdat' リソースを Carbon Printing Manager のデータベースに含める作業はアップルが行っていましたが、現在は行っていません。既存ドライバの場合は、ドライバを改訂して、'pdat' リソースを含める必要があります。
  4. クリエータのタイプとバージョンデータを連結し、CarbonLib データベースで一致する文字列を探します。これで見つからなかった場合は、'vers' 文字列は無視して、ドライバのクリエータのタイプのみを使って、一致する文字列を見つけます。
  5. 一致するものが見つかった場合は、対応する 'pdat' リソースをロードし、それを使って、必要なプリントレコードパラメータを見つけます。
  6. 一致するものが見つからなかった場合は、Carbon Printing Manager は、この仕様の次の節で書かれた手順に従います(以下参照)。

注意:
CarbonLib の 'pdst' リソースにある多数のキーが、 1 つの 'pdat' エントリを指し、複数のドライバが同じ 'pdat' データを共有している場合もあります。


先頭に戻る



'pdat'リソースのないドライバのサポート

現在のドライバで、'pdat' リソースが利用できない場合、Carbon Printing Manager は、2 つのデフォルトの 'pdat' リソースを使います。ドライバのタイプ(prStl.wDev)が 3 の場合、LaserWriter 8 に基づく 'pdat' を使います。 その他のドライバには、アップルの StyleWriter に基づく 'pdat' を使います。互換性の問題(特にラスタプリンタドライバの場合)が出てくると思います。したがって、ドライバに 'pdat' 情報を追加することが重要です。

先頭に戻る



その他の問題

アップルではこれまでに、たとえばアップルのグレースケールとカラーモードのタグがドライバのオプションに対応していないといった問題が起こっています。個々のドライバの機能とアップルの設定を可能な限り対応させ、ユーザが白黒(グレースケールまたは B&W)を選択した時に絶対にカラーになることがないようにします。逆の場合も同様です。

2箇所以上の場所でスカラー値(部数など)を保持するドライバもあります。'pdat' は、このようなプリントレコードを表すことはできません。スカラー値の保存場所は 1 箇所のみにする必要があります。

何人かの開発者の方々から、'pdat' データ構造の中で利用できるようになっていないプリントレコード設定へのアクセス方法についての質問をいただいています。'pdat' の唯一の目的は、アプリケーションに コピー部数、倍率などの一般的な属性にアクセスするアプリケーション API をサポートすることです。したがって 'pdat' リソースは、その他の設定へのアクセスはサポートしていません。

現在は Carbon アプリケーション自体が処理している、コピー部数などの属性の処理に使用されるプリンタドライバもあります。Developer/Examples/Printing/App にある PrintLoop サンプルは、Carbon アプリケーションの印刷処理方法の模範例を示しています。自分のドライバをこのサンプルモデルに合わせる必要があります。

先頭に戻る



開発ツール

アップルでは、ドライバに含める 'pdat' リソース作成の手助けをする 'pdat' ツールを提供しています。以下の「ダウンロード」セクションのリンクをクリックすることでダウンロードできます。

「pdat Creator」ウィンドウ

このウィンドウの左上にはドライバ名が表示されており、その下にはドライバのための有効な 2 つのキーがあります。中央のリストには、利用可能な pdat タグが含まれており、作成することもできます。必須タグは常に保存されるように選択されていて、淡色表示になっています。その他については、ドライバがサポートしている機能はチェックマークを外す必要があります。チェックマークを付けたタグだけをテストすることができ、チェックマークを付けたタグだけが保存されます。また、「pdat Creator」ウィンドウは、ドライバに関係付けられている pdat が見つかった場合はそれを示します。

「Print Record」ウィンドウ

このウィンドウは、タグのテスト時に使用されます。デフォルトのプリントレコードと 'pdat' タグのデータを使って設定されたプリントレコードの違いを強調表示します。プログラムにより、確認のため適切な印刷ダイアログが表示されます。Option キーを押しながらいずれかのエントリをクリックすると、表示を 10 進数から 16 進数へ、またはその逆の変更が可能なポップアップメニューが現れます。ウィンドウ上の何もない場所を Option キーを押しながらクリックすると、すべてのエントリを対象に 10 進数と 16 進数を切り替えます。

pdat ファイルの保存

このボタンをクリックすると、'pdat' リソースファイルを作成するのに利用できる保存オプションが表示されます。デフォルトの設定を使います。

LaserWriter 用のサンプル .r ファイルも、MPW の rez ツールおよび derez ツールに必要な型の記述と一緒に含まれています。

先頭に戻る



要約

プリンタドライバに 'pdat' リソースを提供するのは非常に重要なことです。さもなければ、Mac OS 9 で Carbon アプリケーションを実行するユーザは、プリンタへの出力時に問題に遭遇することになります。新しいドライバおよび改訂した既存のドライバにはすべて、'pdat' リソースを含める必要があります。なぜならアップルでは今後、CarbonLib への 'pdat' リソースの追加は行わないからです。

次に、Classic プリンタドライバが正しく Carbon Printing Manager をサポートするようにするために、実行すべき重要な事柄を示します。

  1. ドライバには 'pdat' リソースを 1 つのみ含めます。
  2. 'pdat' リソース ID は重要ではありません。
  3. PrJobMerge が正しく機能するようにします。
  4. ドライバが、『Inside Mac: Imaging with QuickDraw』の第 9 章で説明されている TPrint フィールドを使えるようにします。
  5. ドライバが一意のクリエータコードを持つようにします。

先頭に戻る



付録 A

CarbonLib 1.4.5 の 'pdat' リソース

次に、CarbonLib 1.4.5 の 'pdat' リソースとそれに対応するプリンタドライバまたはプリンタメーカーを示します。

'pdat' リソース ID 対応するプリンタドライバ
-6001 to -6000 ALPS
-5000 PrintToPDF
-4012 to -4000 Epson
-3001 to -3000 HP DeskJets
-2020 to -2000 Canon BubbleJets
-1004 to -1002 Color StyleWriter
-1001 StyleWriter
-1000 LaserWriter

先頭に戻る



付録 B

LaserWriter 8 の 'pdat'

resource 'pdat' (12888, "LaserWriter") {
 { /* PDatRecords 配列:要素は 10 個 */
  /* [1] */
  Copies {
   2,
   46,
   0xFFFFFFFF,
   1
  },
  /* [2] */
  HRes {
   2,
   6,
   0xFFFFFFFF,
   1
  },
  /* [3] */
  VRes {
   2,
   4,
   0xFFFFFFFF,
   1
  },
  /* [4] */
  Scale {
   2,
   50,
   0xFFFFFFFF,
   1
  },
  /* [5] */
  BlackAndWhiteMode {
   { /* PdatDataType1 配列:要素は 1 個 */
    /* [1] */
    0,
    83,
    0x8,
    0
   }
  },
  /* [6] */
  Portrait {
   { /* PdatDataType1 配列:要素は 1 個 */
    /* [1] */
    0,
    25,
    0x2,
    2
   }
  },
  /* [7] */
  ColorMode {
   { /* PdatDataType1 配列:要素は 1 個 */
    /* [1] */
    0,
    83,
    0x8,
    8
   }
  },
  /* [8] */
  Landscape {
   { /* PdatDataType1 配列:要素は 1 個 */
    /* [1] */
    0,
    25,
    0x2,
    0
   }
  },
  /* [9] */
  ReversePortrait {
   { /* PdatDataType1 配列:要素は 1 個 */
    /* [1] */
    0,
    25,
    0x2,
    2
   }
  },
  /* [10] */
  ReverseLandscape {
   { /* PdatDataType1 配列:要素は 1 個 */
    /* [1] */
    0,
    25,
    0x2,
    0
   }
  }
 }
};

先頭に戻る



付録 C

Apple StyleWriter の 'pdat'

resource 'pdat' (1000, "StyleWriter") {
 { /* PDatRecords 配列:要素は 9 個 */
  /* [1] */
  Copies {
   2,
   46,
   0xFFFFFFFF,
   1
  },
  /* [2] */
  HRes {
   2,
   6,
   0xFFFFFFFF,
   1
  },
  /* [3] */
  VRes {
   2,
   4,
   0xFFFFFFFF,
   1
  },
  /* [4] */
  Scale {
   2,
   50,
   0xFFFFFFFF,
   1
  },
  /* [5] */
  BlackAndWhiteMode {
   { /* 要素は 2 個 */
    /* [1] */
    1,
    48,
    0xFFFF,
    0x0,
    /* [2] */
    1,
    102,
    0xFF,
    0x1
   }
  },
  /* [6] */
  Portrait {
   { /* 要素は 1 個 */
    /* [1] */
    0,
    25,
    0x2,
    0x2
   }
  },
  /* [7] */
  GrayscaleMode {
   { /* 要素は 2 個 */
    /* [1] */
    1,
    48,
    0xFF,
    0x1,
    /* [2] */
    1,
    102,
    0xFF,
    0x8
   }
  },
  /* [8] */
  ColorMode {
   { /* 要素は 2 個 */
    /* [1] */
    1,
    48,
    0xFF,
    0x1,
    /* [2] */
    1,
    102,
    0xFF,
    0x20
   }
  },
  /* [9] */
  Landscape {
   { /* 要素は 1 個 */
    /* [1] */
    0,
    25,
    0x2,
    0x0
   }
  }
 }
};

先頭に戻る



参考文献

Inside Macintosh: Imaging With QuickDraw

Carbon Printing Manager

先頭に戻る



ダウンロード

Acrobat gif

このテクニカルノートの PDF 版

ダウンロード

bluebook gif

Pdat ツール v.6 のサンプル(176K)

ダウンロード

先頭に戻る